/**
 * 给定数组A，找一个连续的区间[s...e]，使得 
 * mex([s...e]) * gcd([s...e])
 * 最大
 * 可以考虑两种可能，一种是含1的，形如[0,1,2,...]的序列
 * 这种的结果就是mex，因此只要找最大的mex即可
 * 整个数组的mex必然是最大的，因此只需要检查整个数组即可
 * 另外一种是不含1的，[0,x]，这种结果就是x，
 * 而且可以发现次情况下再往序列例加东西，结果不然是不增的
 * 因此此情况只需查看0左右各一个位置即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = unsigned long long;
using pii = pair<int, int>;
using vi = vector<int>;

int N;
vi A;

int proc1(){
    int ans = 0;
    for(int i=0;i<N;++i){
        if(A[i]) continue;
        if(i) ans = max(ans, A[i - 1]);
        if(i + 1 < N) ans = max(ans, A[i + 1]);
    }
    return ans;
}

int proc2(){
    vector<int> cnt(N + 1, 0);
    for(auto i : A) ++cnt[i];
    int k = 0;
    while(cnt[k]) ++k;
    return k;
}

bool is0(){
    for(int i : A)if(i)return false;
    return true;
}

int proc(){
    if(is0()) return 0;
    int ans = 0;
    ans = max(ans, proc1());
    ans = max(ans, proc2());
    return ans;
} 

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    cin >> N;
    A.assign(N, 0);
    for(auto & i : A) cin >> i;
    cout << proc() << endl;
    return 0;
}